package com.jms.framework.beans;

/**
 * ChildBeanDefinition类继承自GeneralBeanDefinition，用于定义和描述通过其他Bean间接创建的Bean
 * 它不仅包含了一般Bean定义的信息，还额外记录了创建该Bean的父Bean的信息和方法
 */
public class ChildBeanDefinition extends GeneralBeanDefinition {

    // 创建该子Bean的父Bean的名称
    private final String creatorBeanName;
    // 创建该子Bean的父Bean的方法名称
    private final String creatorBeanMethodName;
    // 创建该子Bean的父Bean的类
    private final Class<?> creatorBeanClass;

    /**
     * 构造函数，初始化ChildBeanDefinition实例
     *
     * @param beanName            Bean的名称
     * @param beanClass           Bean的类
     * @param scope               Bean的作用域
     * @param lazyInit            Bean是否懒初始化
     * @param creatorBeanClass    创建该子Bean的父Bean的类
     * @param creatorBeanName     创建该子Bean的父Bean的名称
     * @param creatorBeanMethodName 创建该子Bean的父Bean的方法名称
     * @param orderNumber         Bean的加载顺序
     * @param afterInit           Bean是否在初始化之后执行
     */
    public ChildBeanDefinition(String beanName,
                               Class<?> beanClass,
                               String scope,
                               boolean lazyInit,
                               Class<?> creatorBeanClass,
                               String creatorBeanName,
                               String creatorBeanMethodName,
                               int orderNumber,
                               boolean afterInit) {
        super(beanName, beanClass, scope, lazyInit, orderNumber, afterInit);
        this.creatorBeanName = creatorBeanName;
        this.creatorBeanMethodName = creatorBeanMethodName;
        this.creatorBeanClass = creatorBeanClass;
        // 创建一个Bean依赖对象，表示该子Bean依赖于其父Bean
        BeanDependency dependency = new BeanDependency(creatorBeanName, creatorBeanClass.getName(), null);
        // 设置该子Bean的依赖为刚刚创建的Bean依赖对象
        setDependencies(new BeanDependency[]{dependency});
    }

    /**
     * 获取创建该子Bean的父Bean的名称
     *
     * @return 父Bean的名称
     */
    public String getCreatorBeanName() {
        return creatorBeanName;
    }

    /**
     * 获取创建该子Bean的父Bean的类
     *
     * @return 父Bean的类
     */
    public Class<?> getCreatorBeanClass() {
        return creatorBeanClass;
    }

    /**
     * 获取创建该子Bean的父Bean的方法名称
     *
     * @return 父Bean的方法名称
     */
    public String getCreatorBeanMethodName() {
        return creatorBeanMethodName;
    }
}
